﻿//option参数集合    
//isCheck 是否显示CheckBox
//allowSelParent 是否可以选择父级(可选)
//autoShow 是否自动展开(可选)
(function ($) {
    $.fn.initZtreeSelect = function (option, isCheck, allowSelParent, autoShow) {
        var self = this;//当前点击文本框

        var treeId = "treeDemo" + "_zTree";
        var contentId = "treeDemo" + "_zTreeMenuContent";
        if (!option.putName) {
            option.putName = self.attr("id");
        }
        treeId = option.putName + "_zTree";
        contentId = option.putName + "_zTreeMenuContent";
        var contentObj = $("#" + contentId);
        var putObj = $("#" + option.putName);

        var putIdsObj = "";
        if (option.putId) {
            putIdsObj = $("#" + option.putId);
        }


        //存在就删除
        if (contentObj.length > 0) {
            contentObj.remove();
        }
        //<div id="menuContent" class="menuContent" style="display: none; position: absolute;z-index:9999;">
        //    <ul id="treeDemo" class="ztree" style="margin-top: 0; width: 180px; height: 300px;"></ul>
        //</div>
        var html = "<div id=\"" + contentId + "\" class=\"menuContent\" style=\"display:none;position: fixed;z-index:9999;\"><ul id=\"" + treeId + "\" class=\"ztree\" style=\"margin-top: 0; width: 180px; height: 300px;\"></ul></div>";
        $("body").append(html);
        var setting = {
            view: {
                dblClickExpand: false,
                selectedMulti: false//是否多选  Ctrl键
            },
            check: {
                enable: isCheck == undefined ? false : isCheck,     //是否显示CheckBox
                chkboxType: { "Y": "", "N": "" }                    //设置父联子 子联父  此处已去掉关联
            },
            data: {
                simpleData: {
                    enable: true
                }
            },
            callback: {
                beforeClick: function (treeId, treeNode) {
                    //用于捕获单击节点之前的事件回调函数，并且根据返回值确定是否允许单击操作
                    //var check = ((treeNode && !treeNode.isParent) || allowSelParent);
                    ////console.log(check);
                    //if (!check) alert("请选择子节点");
                    //return check;
                },
                onClick: function (e, treeId, treeNode) {
                    //console.log(treeNode);
                    //点击
                    //获取当前的树节点数据
                    var zTree = $.fn.zTree.getZTreeObj(treeId);
                    var flag = treeNode.checked ? false : true;
                    //需要勾选 或 取消勾选 的节点数据
                    //2
                    //checked = true 表示勾选节点
                    //checked = false 表示节点取消勾选

                    //勾选当前选中的节点
                    zTree.checkNode(treeNode, flag, true);
                    self.getNodes(zTree);
                },
                onCheck: function (e, treeId, treeNode) {
                    //勾选 取消勾选
                    //获取当前的树节点数据
                    var zTree = $.fn.zTree.getZTreeObj(treeId);
                    self.getNodes(zTree);
                }
            }
        };


        self.getNodes = function (zTree) {
            if (!zTree) {
                zTree = $.fn.zTree.getZTreeObj(treeId);
            }
            //checkBox
            //check的选中 或者是  选中值。。
            var treeNodes = isCheck ? zTree.getCheckedNodes(true) : zTree.getSelectedNodes();
            var names = "";
            var ids = "";
            var lengthNodes = treeNodes.length;
            console.log(treeNodes);
            for (var j = 0; j < lengthNodes ; j++) {
                var item = treeNodes[j];
                names += item.name + ",";
                ids += item.id + ",";
            }
            //处理被选中的值
            //移除最后一个   ,
            if (names.length > 0) {
                names = names.substr(0, names.length - 1);
            }
            if (ids.length > 0) {
                ids = ids.substr(0, ids.length - 1);
            }
            if (putObj) putObj.val(names);
            if (putIdsObj) putIdsObj.val(ids);

            //回调函数
            if (option.callback) {
                //把当前选中的节点的值回传
                option.callback(treeNodes);
            }
            //不显示checkbox的话 就关闭
            if (!isCheck) $("#" + contentId).slideUp("fast");
        };


        //显示
        self.showMenu = function () {
            var cityObj = $("#" + option.putName);
            var cityOffset = $("#" + option.putName).offset();
            $("#" + contentId).css({ left: cityOffset.left + "px", top: cityOffset.top + cityObj.outerHeight() + "px" }).slideDown("fast");
            $("body").bind("mousedown", self.onBodyDown);
        };
        //
        self.onBodyDown = function (event) {
            if (!(event.target.id == option.putName || event.target.id == contentId || $(event.target).parents("#" + contentId).length > 0)) {
                self.hideMenu();
            }
        };
        //隐藏
        self.hideMenu = function () {
            $("#" + contentId).fadeOut("fast");
            $("body").unbind("mousedown", self.onBodyDown);
        };


        putObj.click(function () {
            self.showMenu();
        });
        //加载数
        $.fn.zTree.init($("#" + treeId), setting, option.data);

        //选中默认值
        var len = option.data.length;
        var zTree = $.fn.zTree.getZTreeObj(treeId);

        for (var k = 0; k < len; k++) {
            var item = option.data[k];
            // checked
            if (item.isSelect) {
                //根据ID获取 匹配的节点对象
                var denode = zTree.getNodeByParam("id", item.id, null);
                //true 表示追加选中，会出现多点同时被选中的情况
                //false 表示单独选中，原先被选中的节点会被取消选中状态
                zTree.selectNode(denode, false);
                //显示的文本框赋值（name）
                putObj.val(denode.name);
                //给隐藏的文本框赋值（ID）
                if (putIdsObj) putIdsObj.val(denode.id);
                //循环一个之后就跳出
                return false;
            }
        }

        if (autoShow) self.showMenu();
    };
})(jQuery);